#include "common.h"

void GPIO_Config(void)
{
    RCC->APB2ENR |= 0x1fc;
    GPIO_InitTypeDef gpio_init;

    gpio_init.Mode  = GPIO_MODE_OUTPUT_PP;
    gpio_init.Pin   = C_Fault_Pin;
    gpio_init.Pull  = GPIO_PULLDOWN;
    gpio_init.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(C_Fault_GPIO, &gpio_init);

    //////////////////////////////
    RCC->APB1ENR |= (1 << 27) | (1 << 28);
    PWR->CR |= (1 << 8);
    RCC->BDCR &= ~(1 << 0);  // 禁止使用外部低速时钟
    while (RCC->BDCR & (1 << 1))
        ;  // 等待外部低速时钟停止
    PWR->CR &= ~(1 << 8);

    gpio_init.Pin   = HG_Pin;
    gpio_init.Mode  = GPIO_MODE_OUTPUT_PP;  // 推挽输出
    gpio_init.Pull  = GPIO_PULLDOWN;
    gpio_init.Speed = GPIO_SPEED_FREQ_LOW;
    HAL_GPIO_Init(HG_GPIO, &gpio_init);

    /********************************************************
    输入
    ***********************************************************/
    ///////////////////////////////////////
    gpio_init.Pin   = Break_In_Pin;
    gpio_init.Pull  = GPIO_PULLDOWN;
    gpio_init.Mode  = GPIO_MODE_INPUT;  // 浮空输入
    gpio_init.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(Break_In_GPIO, &gpio_init);

    ///////////////////////////////////////
    gpio_init.Pin   = Water_Press_Pin;
    gpio_init.Pull  = GPIO_PULLDOWN;
    gpio_init.Mode  = GPIO_MODE_INPUT;  // 输入
    gpio_init.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(Water_Press_GPIO, &gpio_init);

    ///////////////////////////////////////
    gpio_init.Pin   = QBH_Pin;
    gpio_init.Pull  = GPIO_PULLDOWN;
    gpio_init.Mode  = GPIO_MODE_INPUT;  // 下拉输入
    gpio_init.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(QBH_GPIO, &gpio_init);

    C_FAULT(ON);
    Delay_1ms(10);
    C_FAULT(OFF);
    HG_CTRL(OFF);
}
